package com.unitd.modules.sys.controller;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import com.unitd.comm.constant.ToolConstant;
import com.unitd.comm.web.BaseController;
import com.unitd.frame.comm.utils.BooleanUtils;
import com.unitd.frame.comm.utils.MapUtils;
import com.unitd.frame.comm.utils.StringUtils;
import com.unitd.frame.springweb.controller.result.AjaxResult;
import com.unitd.frame.sso.annotation.Permission;
import com.unitd.modules.sys.entity.SysOrg;
import com.unitd.modules.sys.entity.SysRole;
import com.unitd.modules.sys.entity.SysRoleMenu;
import com.unitd.modules.sys.entity.SysRoleOrg;
import com.unitd.modules.sys.service.ISysOrgService;
import com.unitd.modules.sys.service.ISysRoleMenuService;
import com.unitd.modules.sys.service.ISysRoleOrgService;
import com.unitd.modules.sys.service.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc 角色表View端控制器类
 * @filename SysRoleController.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017-04-26
 */
@Controller
@RequestMapping("/sys/sysRole")
public class SysRoleController extends BaseController {

	@Autowired
	private ISysRoleService sysRoleService;
	@Autowired
	private ISysRoleMenuService sysRoleMenuService;
	@Autowired
	private ISysOrgService orgService;
	@Autowired
	private ISysRoleOrgService roleOrgService;

	/**
	* @desc 转到信息列表页
	* @return 列表页地址
	*/
	@Permission("sys:sysRole:list")
	@RequestMapping("/list")
	public String toList() {
		return "/modules/sys/sysRole/list";
	}

	/**
	* @desc 获取信息列表json数据,方便列表页通过ajax获取并展示
	* @param param 前端请求参数信息
	* @return json数据
	*/
	@Permission("sys:sysRole:list")
	@RequestMapping("/listJson")
	@ResponseBody
	public String listJson(@RequestParam Map<String, Object> param) {

		// 获取分页数据信息
		Map<String, Integer> pageMap = getPageMap();

		// 转换页面查询参数为查询对象
		SysRole sysRole = new SysRole();
		MapUtils.toBean(param, sysRole);

		// 查询列表数据
		PageInfo<SysRole> pageData = sysRoleService.getPageData(pageMap.get("pageNo"), pageMap.get("pageSize"), sysRole);
		return jsonPage(pageData);
	}

	/**
	 * @desc 根据主键ID获取详情信息, 并将获取的信息在详情页展示转到信息列表页
	 * @return 详情页地址及数据
	 */
	@Permission("sys:sysRole:view")
	@RequestMapping("/toView/{id}")
	public String toView(Model model, @PathVariable("id") String id) {
		SysRole sysRole = sysRoleService.findBy(id);

		model.addAttribute("sysRole", sysRole);
		model.addAttribute("action", "doView");
		return "/modules/sys/sysRole/edit";
	}

	/**
	 * @desc 根据主键ID获取详情信息, 并将获取的信息在详情页展示转到信息列表页
	 * @return 详情页地址及数据
	 */
	@Permission("sys:sysRole:edit")
	@RequestMapping(value = "/toEdit/{id}")
	public String toEdit(Model model, @PathVariable("id") String id) {
		SysRole sysRole = sysRoleService.findBy(id);

		model.addAttribute("sysRole", sysRole);
		return "/modules/sys/sysRole/edit";
	}

	/**
	 * @desc 处理详情信息的新增/修改操作
	 * @param model springMVC的数据模型对象
	 * @param sysRole 需要新增/修改的详情信息
	 * @param param 前端请求参数集合
	 * @return 操作结果
	 */
	@Permission("sys:sysRole:edit")
	@RequestMapping("/doEdit")
	@ResponseBody
	public AjaxResult doEdit(Model model, SysRole sysRole, @RequestParam Map<String, Object> param) {
		// 调用Hibernate-validate进行数据校验
		String validatMsg = beanValidator(model, sysRole);
		if(!StringUtils.isNull(validatMsg)) {
			return new AjaxResult(false, "处理数据失败![" +validatMsg+"]");
		}

		// 将数据存入Map对象,方便service使用
		param.put(SysRole.class.getName(), sysRole);
		param.put(ToolConstant.USER_TOKEN_ID, getSSOToken().getUid()); 						// 当前的登录用户主键
		param.put(ToolConstant.USER_TOKEN_NAME, getSSOToken().getUname()); 					// 当前的登录用户名

		// 调用service,处理数据保存
		sysRoleService.doEdit(param);

		// 根据处理结果,反馈给前端
		return new AjaxResult(true);
	}

	/**
	 * @desc 根据主键ID, 删除对应的详情信息
	 * @param ids 需要删除的详情信息ID串,多个ID之间用,分割
	 * @return 删除结果
	 */
	@Permission("sys:sysUser:delete")
	@RequestMapping("/doDelete/{id}")
	@ResponseBody
	public AjaxResult doDelete(@PathVariable("id") String ids) {
		// 根据ID删除信息
		sysRoleService.doDelete(ids);

		// 根据处理结果,反馈给前端
		return new AjaxResult(true);
	}

	/**
	 * @desc 跳转到权限分配页面
	 * @param model
	 * @param id
	 * @return
	 */
	@Permission("sys:sysRole:allot")
	@RequestMapping("/allot/{id}")
	public String allot(Model model, @PathVariable("id") String id) {
		model.addAttribute("roleId", id);
		return "/modules/sys/sysRole/allot";
	}

	/**
	 * @desc 跳转到机构分配页面
	 * @param model
	 * @param id
	 * @return
	 */
	@Permission("sys:sysRole:allot")
	@RequestMapping("/allot/org/{id}")
	public String allotOrg(Model model, @PathVariable("id") String id) {
		model.addAttribute("roleId", id);
		return "/modules/sys/sysRole/org";
	}

	/**
	 * @desc 获取权限树
	 * @param model  MVC的数据模型对象
	 * @param roleId 角色ID
	 * @return 角色权限树的json串
	 */
	@Permission("sys:sysRole:allot")
	@RequestMapping("/right")
	@ResponseBody
	public String right(Model model, @RequestParam(value = "roleId") String roleId) {

		// 根据角色ID获取该角色对应的所有权限菜单信息
		List<Map<String, Object>> rightList = sysRoleService.getRoleRightTreeByRoleId(roleId);

		// 将菜单的列表信息转换成树结构json
		return JSON.toJSONString(rightList);
	}

	/**
	 * @desc 更新权限列表
	 * @param roleId 角色ID
	 * @param rights 权限菜单ID串,每个ID用,分割
	 * @return
	 * @throws Exception
	 */
	@Permission("sys:sysRole:allot")
	@RequestMapping("/allot")
	@ResponseBody
	public String allot( @RequestParam(value = "roleId", required = false) String roleId,
								  @RequestParam(value = "rights", required = false) String rights) throws Exception {
		try {
			// 查询出本角色已经分配了的权限
			SysRoleMenu sysRoleMenu = new SysRoleMenu();
			sysRoleMenu.setRoleId(roleId);
			List<SysRoleMenu> roleRightList = sysRoleMenuService.listByBean(sysRoleMenu);

			// 如果存在权限，先进行删除
			if (roleRightList.size() > 0) {
				for (SysRoleMenu rp : roleRightList) {
					sysRoleMenuService.deleteByPrimaryKey(rp.getId());
				}
			}

			// 添加新分配的权限
			String[] rightIds = rights.split(",");
			if (StringUtils.isNotBlank(rights)) {
				// 添加新分配的权限
				List<SysRoleMenu> sysRoleMenus = new ArrayList<>();
				SysRoleMenu roleMenu;
				for (String pid : rightIds) {
					roleMenu = new SysRoleMenu();
					roleMenu.setRoleId(roleId);
					roleMenu.setMenuId(pid);

					sysRoleMenus.add(roleMenu);
				}
				sysRoleMenuService.batchInsertSelective(sysRoleMenus);
			}
			return BooleanUtils.toString(true);
		} catch (Exception e) {
			return BooleanUtils.toString(false);
		}
	}

	/**
	 * @param roleId 角色ID
	 */
	@Permission("sys:sysRole:allot")
	@RequestMapping("/org/role")
	@ResponseBody
	public String orgRole(@RequestParam(value = "roleId") String roleId) {
		List<SysOrg> orgs = orgService.listAll();
		SysRoleOrg roleOrg = new SysRoleOrg();
		roleOrg.setRoleId(roleId);
		List<SysRoleOrg> sysRoleOrgs = roleOrgService.listByBean(roleOrg);
		List<String> roleOrgList = new ArrayList<>();
		for(SysRoleOrg ro : sysRoleOrgs){
			roleOrgList.add(ro.getOrgNo());
		}

		List<Map<String, Object>> rightList = new ArrayList<>();
		for (SysOrg org : orgs) {
			Map<String, Object> map = new HashMap<>();
			map.put("id", org.getOrgNo());
			map.put("pId", org.getParentNo());
			map.put("name", org.getOrgName());

			// 默认展开树
			map.put("open", "true");
			// 如果角色已有该权限，则默认选中
			if (roleOrgList.contains(org.getOrgNo())) {
				map.put("checked", "true");
			}
			rightList.add(map);
		}
		return JSON.toJSONString(rightList);
	}

	/**
	 * @desc 更新权限列表
	 * @param roleId 角色ID
	 * @param orgs  机构orgNo用,分割
	 * @return
	 */
	@Permission("sys:sysRole:allot")
	@RequestMapping("/allot/role/org")
	@ResponseBody
	public String allotRoleOrg( @RequestParam(value = "roleId", required = false) String roleId,
						 @RequestParam(value = "orgs", required = false) String orgs) {
		try {
			// 查询出本角色已经分配了机构
			SysRoleOrg roleOrg = new SysRoleOrg();
			roleOrg.setRoleId(roleId);
			List<SysRoleOrg> roleOrgList = roleOrgService.listByBean(roleOrg);

			// 如果存在机构，先进行删除
			if (roleOrgList.size() > 0) {
				for (SysRoleOrg ro : roleOrgList) {
					roleOrgService.deleteByPrimaryKey(ro.getId());
				}
			}

			// 添加新分配的机构
			String[] orgNos = orgs.split(",");
			if (StringUtils.isNotBlank(orgs)) {
				// 添加新分配的权限
				List<SysRoleOrg> sysRoleOrgs = new ArrayList<>();
				SysRoleOrg sysRoleOrg;
				for (String orgNo : orgNos) {
					sysRoleOrg = new SysRoleOrg();
					sysRoleOrg.setRoleId(roleId);
					sysRoleOrg.setOrgNo(orgNo);
					sysRoleOrgs.add(sysRoleOrg);
				}
				roleOrgService.batchInsertSelective(sysRoleOrgs);
			}
			return BooleanUtils.toString(true);
		} catch (Exception e) {
			return BooleanUtils.toString(false);
		}
	}
}